#include "../include/common.h"

/**
 * 生成随机测试数据
 * @param n 物品数量
 * @param filename 输出文件名
 */
void generate_data(int n, const char* filename) {
    FILE* fp = fopen(filename, "w");
    if (!fp) {
        printf("Error opening file %s\n", filename);
        return;
    }

    // 写入CSV文件头
    fprintf(fp, "id,weight,value\n");
    
    // 生成n个物品的随机数据
    for (int i = 1; i <= n; ++i) {
        int weight = rand() % 100 + 1;  // 生成1-100的随机重量
        double value = 100 + (rand() % 901) + (rand() % 100) / 100.0;  // 生成100-1000的随机价值
        fprintf(fp, "%d,%d,%.2f\n", i, weight, value);
    }
    fclose(fp);
}

/**
 * 从CSV文件读取测试数据
 * @param filename 输入文件名
 * @param n 物品数量的指针，用于返回实际读取的物品数量
 * @return 物品数组，失败返回NULL
 */
Item* read_data(const char* filename, int* n) {
    FILE* fp = fopen(filename, "r");
    if (!fp) {
        printf("Error opening file %s\n", filename);
        return NULL;
    }

    // 跳过标题行
    char line[256];
    fgets(line, sizeof(line), fp);

    // 计算行数（物品数量）
    *n = 0;
    while (fgets(line, sizeof(line), fp)) {
        (*n)++;
    }

    // 重新打开文件
    fclose(fp);
    fp = fopen(filename, "r");
    fgets(line, sizeof(line), fp);  // 跳过标题行

    // 分配内存
    Item* items = (Item*)malloc(*n * sizeof(Item));
    if (!items) {
        printf("Memory allocation failed\n");
        fclose(fp);
        return NULL;
    }

    // 读取数据
    for (int i = 0; i < *n; ++i) {
        fgets(line, sizeof(line), fp);
        sscanf(line, "%d,%d,%lf", &items[i].id, &items[i].weight, &items[i].value);
    }

    fclose(fp);
    return items;
}

/**
 * 释放物品数组内存
 * @param items 物品数组
 */
void free_items(Item* items) {
    if (items) {
        free(items);
    }
}

/**
 * 打印算法运行结果
 * @param result 结果结构体
 * @param algorithm_name 算法名称
 */
void print_result(Result* result, const char* algorithm_name) {
    printf("\n%s Results:\n", algorithm_name);
    printf("Total Value: %.2f\n", result->total_value);
    printf("Selected Items: ");
    for (int i = 0; i < result->selected_count; ++i) {
        printf("%d ", result->selected_items[i]);
    }
    printf("\n");
    printf("Time Taken: %.2f ms\n", result->time_taken);
    printf("Memory Used: %zu bytes\n", result->memory_used);
}

/**
 * 保存算法运行结果到CSV文件
 * @param result 结果结构体
 * @param algorithm_name 算法名称
 * @param n 物品数量
 * @param capacity 背包容量
 * @param filename 输出文件名
 */
void save_result(Result* result, const char* algorithm_name, int n, int capacity, const char* filename) {
    FILE* fp = fopen(filename, "a");
    if (!fp) {
        printf("Error opening file %s\n", filename);
        return;
    }

    // 写入结果：算法名称,物品数量,背包容量,总价值,执行时间,内存使用
    fprintf(fp, "%s,%d,%d,%.2f,%.2f,%zu\n",
            algorithm_name, n, capacity,
            result->total_value, result->time_taken,
            result->memory_used);

    fclose(fp);
} 